Skip to content

Add macOS disk resize support#678

Open
balcsida wants to merge 15 commits into
insidegui:mainfrom
balcsida:feat/macos-disk-resize-compact
Open

Add macOS disk resize support#678
balcsida wants to merge 15 commits into
insidegui:mainfrom
balcsida:feat/macos-disk-resize-compact

Conversation

@balcsida
Copy link
Copy Markdown

@balcsida balcsida commented May 23, 2026

What the resize feature does is that when a guest VM starts the next time, before the guest OS boots, VirtualBuddy inspects the guest disk image by temporarily attaching it on the host with hdiutil and reading the partition layout. If it finds an APFS-on-GPT layout, it treats it as a macOS guest disk and checks for locked APFS volumes / FileVault first:

  • If the disk is encrypted, the resize is blocked. I couldn't find a reliable way to resize FileVault-protected APFS offline, even after trying the recovery key in multiple formats. I may revisit this later.
  • If the disk is not encrypted, the disk image is expanded to the requested size. Then diskutil expands the GPT layout and the APFS container to match. If APFS does not pick up the new ceiling on the first pass, which sometimes happens, the resizer applies a small shrink-and-grow nudge to force APFS to recompute the available space.

@balcsida balcsida force-pushed the feat/macos-disk-resize-compact branch 2 times, most recently from f5ac0a5 to 2cfd5fe Compare May 23, 2026 21:28
@balcsida balcsida mentioned this pull request May 23, 2026
@balcsida balcsida force-pushed the feat/macos-disk-resize-compact branch from 2cfd5fe to 5e9a160 Compare May 23, 2026 21:45
Copy link
Copy Markdown
Owner

@insidegui insidegui left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added some comments about the code, mostly just nitpicks.

I couldn't test it yet though, as I couldn't figure out how to access the disk resizing feature. At first I thought the resizing arrow icon was a button, but it's just an indicator, and the ellipsis button that gives access to the disk settings remains disabled for the boot disk, even when it indicates that it's resizable.

Image

Comment thread VirtualCore/Source/Models/Configuration/ConfigurationModels.swift
Comment thread VirtualCore/Source/Models/Configuration/ConfigurationModels.swift
Comment thread VirtualCore/Source/Models/VBVirtualMachine+Metadata.swift Outdated
Comment thread VirtualCore/Source/Virtualization/VMController.swift Outdated
Comment thread VirtualCore/Source/Virtualization/VMController.swift Outdated
Comment thread VirtualUI/Source/VM Configuration/Sections/Storage/ManagedDiskImageEditor.swift Outdated
Comment thread VirtualUI/Source/VM Configuration/Sections/Storage/ManagedDiskImageEditor.swift Outdated
@balcsida
Copy link
Copy Markdown
Author

Strange, it works for me:

Cap.2026-05-25.at.22.11.41.mp4

@insidegui
Copy link
Copy Markdown
Owner

Strange, it works for me

I think it didn't work for me because that VM had an ASIF boot disk image.

This can be done later, but we should probably move the disk image format option into the managed disk image editor UI, with information about the differences in resizability between the two formats.

Currently that is a global setting in the app:

image

There are significant tradeoffs between the choices, so informing the user about those tradeoffs would help them decide 😄

@insidegui
Copy link
Copy Markdown
Owner

One more nitpick. The resizable indicator should probably use a secondary foreground style. Using the accent color makes it look like a button.

image

@balcsida balcsida requested a review from insidegui May 26, 2026 21:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants